import java.util.concurrent.*;

/**
 * 不要用Executors中创建线程池的方法
 * 不要用Executors中创建线程池的方法
 * 不要用Executors中创建线程池的方法
 * 不要用Executors中创建线程池的方法
 *
 * 存在的问题 ：1.线程池数量没有限制，Integer.MAX_VALUE
 *              2.FinThreadPool ,没有设置队列上线
 *
 * 如何正确的使用线程池：1.使用线程进行控制
 *                       2.线程运行失败进行后续处理
 *                       3.优雅的关闭
 * */
public class BaseExecutorPool {

    public static ThreadPoolExecutor getBaseThreadPoolExecutor(){

        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                5,
                Runtime.getRuntime().availableProcessors() * 2, //系统的线程数乘以2 -->计算机密集型 核数 *2 ，IO密集型（写文件，网络传输、数据库） cpu核数/（1-阻塞系数（0.8--0.9））
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(200),
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        Thread t = new Thread(r);
                        if (t.isDaemon()) {
                            t.setDaemon(false);//如果是守护线程，去掉守护
                        }
                        if (Thread.NORM_PRIORITY != t.getPriority()) { //如果设置了优先级，取消优先级
                            t.setPriority(Thread.NORM_PRIORITY);
                        }
                        return t;
                    }
                },
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        System.out.println("拒绝策略，当前那个任务被拒绝了");
                    }
                });
        return pool;
    }

    public static void shutdownBaseThreadPoolExecutor(ThreadPoolExecutor pool){
        pool.shutdown();
    }
}
